package main // 声明 main 包，表明当前是一个可执行程序

import (
	"fmt"
	"math"
) // 导入内置 fmt

func main() { // main函数，是程序执行的入口

	fmt.Println("Hello World!") // 在终端打印 Hello World!

	var a int
	var b float32

	var c, d float64
	e, f := 32, 64
	var g = "china"
	println(a, b, c, d, e, f, g)

	fmt.Println("============匿名变量============")

	_, v, _ := getData()
	fmt.Println(v)

	fmt.Println("============常量============")
	const name = "您好"
	fmt.Println(name)

	fmt.Println("============循环============")

	sum := 0
	for i := 0; i < 100; i++ {
		sum += i
	}
	fmt.Println(sum)

	sum2 := 1
	for sum2 < 100 {
		sum2 += sum2
	}
	fmt.Println(sum2)

	/*	sum3 := 1
		for{
			sum3 += sum3
		}
	*/

	n := 1
	demo1(&n)
	fmt.Println("返回后c值为: ", n)

	//数组
	//var gg []int

	fmt.Println("============切片============")

	//切片
	ee := []string{"aaa", "bbb", "ccc", "ddd"}

	e1 := ee[0:2]
	e2 := ee[1:3]
	fmt.Println(ee)
	fmt.Println(e1, e2)
	e2[0] = "xxx"
	fmt.Println(ee)
	fmt.Println(e1, e2)

	e2 = append(e2, "cccc")
	fmt.Println(e2)

	fmt.Println("============make切片============")

	//make,可通过make创建切片
	//type,len(b)=0, cap(b)=5,这里面容量为5，但是里面没有值 []
	ff := make([]int, 0, 5)
	//type,len(b)=5 这里面为5个0数组 [0,0,0,0,0]
	ff2 := make([]int, 5)
	ff = append(ff, 1)
	ff = append(ff, 2)
	ff = append(ff, 3)
	ff = append(ff, 4)
	ff = append(ff, 5)
	ff = append(ff, 6)
	fmt.Println(ff)
	fmt.Println(ff2)

}

func getData() (int, int, int) {
	return 7, 8, 9
}

func pow(x, n, lim float64) float64 {
	if v := math.Pow(x, n); v < lim {
		return v
	}
	return lim
}

// 函数
func funDemo(a, b int) (c, d int) {
	c = a
	d = b
	return
}

// defer java中的finally一个意思
func deferDemo() {
	defer fmt.Println("1")

	fmt.Println("2")
}

// 指针
// 用&取地址，用*取地址中的值
func demo1(c *int) {
	a := 22
	//获取指针地址
	b := &a
	fmt.Println(b)
	//获取指针地址的值
	fmt.Println(*b)

	fmt.Println("传入c值为:", *c)
	*c = a
	fmt.Println("更改后c值为:", *c)
}
